#include<bits/stdc++.h>
using namespace std;
struct car{
    int d,v,a;
    double st,ed;
    bool os;
}c[100005];
int t,n,m,L,V;
int a1,a2;
int p[100005];
bool as;
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d",&n,&m,&L,&V);
        a1=0,a2=m;
        as=true;
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&c[i].d,&c[i].v,&c[i].a);
            c[i].os=false;
            if(c[i].a==0){
                if(c[i].v>V){
                    c[i].os=true;
                    c[i].st=c[i].d;
                    c[i].ed=L;
                }
            }
            else  if(c[i].a>0){
                double tmp=(V*V-c[i].v*c[i].v)/(2*c[i].a);
                if(c[i].d+tmp<=L){
                    c[i].os=true;
                    c[i].st=c[i].d+tmp;
                    c[i].ed=L;
                }
            }
            else{
                as=false;
                if(c[i].v<=V)  continue;
                c[i].os=true;
                double tmp=(V*V-c[i].v*c[i].v)/(2*c[i].a);
                c[i].st=c[i].d;
                c[i].ed=min((double)L,c[i].d+tmp);
            }
        }
        for(int i=1;i<=m;i++)  scanf("%d",&p[i]);
        for(int i=1;i<=n;i++){
            if(!c[i].os)  continue;
            bool flag=true;
            for(int j=1;j<=m;j++){
                if(p[j]>c[i].ed){
                    flag=false;
                    break;
                }
                if(p[j]>=c[i].st&&p[j]<=c[i].ed)  break;
            }
            c[i].os=flag;
            if(c[i].os)  a1++;
        }
        printf("%d ",a1);
        if(as)  printf("%d\n",n-1);
        else{
            for(int i=0;i<1<<m;i++){
                bool flag=true;
                int cn=0;
                for(int j=1;j<=m;j++){
                    if(i&(1<<j-1)) cn++;
                }
                for(int j=1;j<=n;j++){
                    if(!c[j].os)  continue;
                    for(int k=1;k<=m;k++){
                        if(p[k]>c[j].ed){
                            flag=false;
                            break;
                        }
                        if(p[k]>=c[j].st&&p[k]<=c[j].ed&&(i&(1<<k-1)))  break;
                    }
                    if(!flag)  break;
                }
                if(!flag)  continue;
                a2=min(a2,cn);
            }
            printf("%d\n",n-a2);
        }
    }
    return 0;
}
